// 路由鉴权  当前路由能不能被用户访问的设置
import router from "./router";
import nprogress from "nprogress";
// 引入进度条的样式
import "nprogress/nprogress.css";
import useUserStore from "./store/modules/user";
import { GET_TOKEN } from "@/utils/token.ts";
import { ElNotification } from "element-plus";
import setting from "@/setting.ts";

// 在组件外使用仓库 是没法直接获取到对应的子仓库的  需要访问pinia大仓库
// let userStore = useUserStore(pinia);
//
// console.log(userStore);

// 全局的前置守卫 from 从哪里来 to 到哪里去 next() 放行
router.beforeEach(async (to, from, next) => {
  nprogress.start();
  let userStore = useUserStore();

  // 登录的时候这个地方会有一个延迟，所以这个地方不能直接使用userStore.token
  let token = (userStore.token = userStore.token || GET_TOKEN());

  // 如果有token 说明已经登录了
  if (token) {
    // 如果是登录页面的话  就不让他去登录页面
    if (to.path == "/login") {
      next(false);
    } else {
      // 如果有token 但是没有用户名 说明本地的session有数据 但是pinia的仓库没有数据  很有可能是刷新页面了
      let username = userStore.username;
      if (username) {
        // 如果有用户名 说明pinia的仓库有数据  直接放行
        next();
      } else {
        // 如果没有用户名 说明pinia的仓库没有数据  需要发送请求获取用户信息 然后放行
        try {
          await userStore.userInfo();
          next({ ...to, replace: true });
        } catch (e) {
          // token过期了  获取用户信息失败 消息提示
          // 退出登录
          // 回到登录页面
          ElNotification.error({
            title: "获取用户信息失败",
            message: `获取用户信息失败，请重新登录！`,
          });
          await userStore.userLogout();
          next({
            path: "/login",
            query: {
              redirect: to.fullPath,
            },
          });
        }
      }
    }
  } else {
    // 没有登录的话  返回到登录页面
    if (to.path == "/login") {
      next();
    } else {
      next({
        path: "/login",
        query: {
          redirect: to.fullPath,
        },
      });
    }
  }
});

// 全局的后置守卫
router.afterEach((to, from) => {
  document.title = setting.title + "-" + to.meta.title;
  nprogress.done();
});
